// 引入
const Koa = require('koa');
const app = new Koa();
const fs = require('fs');
const core_path = require('path');

// 没有使用中间
// 中间件的本质：就是一个函数
const logger = async (ctx, next) => {
    // http://localhost:3000/login?username=rui&password=123456
    // 请求方法：GET、POST、PUT、DELETE
    const method = ctx.method;
    // 请求路径（包含参数部分）：/login?username=rui&password=123456
    const url = ctx.url;
    // 请求路径（不包含参数部分）：/login
    const path = ctx.path;
    // 请求路径中的参数：username=rui&password=123456 解析成键值对的对象
    const query = ctx.query;
    // 请求路径中的参数（原始参数）
    const querystring = ctx.querystring;
    // 解析请求体
    // ...
    console.log({ method, url, path, query, querystring });

    if (ctx.path === '/login') {
        console.log('这是登录接口');
    }

    // 请求前的逻辑
    const start = Date.now();

    await next();

    // 响应前的逻辑
    let loggerStr = `请求方式：${ctx.method}, 请求路径：${
        ctx.path
    }, 请求用时：${Date.now() - start}\n`;

    // 将请求信息写入到日志文件中
    // __dirname：表示当前文件所在的目录
    // __filename：表示当前文件的绝对路径
    fs.appendFile(
        core_path.join(__dirname, './logger.txt'),
        loggerStr,
        'utf-8',
        (error) => {
            if (error) console.log('记录日志失败');
        },
    );
};

const delayMiddlware = async () => {
    await delay();
};

function delay() {
    return Promise.resolve({
        then: (resolve) => {
            setTimeout(() => {
                resolve();
            }, 3000);
        },
    });
}

// 使用中间件
app.use(logger);
// app.use(delayMiddlware);

// 监听端口
let port = 3000;
app.listen(port, () => {
    console.log(`Koa server listening at http://localhost:${port}`);
});
